package com.imooc.order.controller;

import com.imooc.product.client.ProductClient;
import com.imooc.product.common.DecreaseStockInput;
import com.imooc.product.common.ProductInfoOutput;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;
import java.util.List;

/**
 * 用于调用商品服务的接口
 * @author steve
 * @date 2020/6/17 11:35
 */
@RestController
@Slf4j
public class ClientController {
    @Autowired
    private LoadBalancerClient loadBalancerClient;

//    @Autowired
//    private RestTemplate restTemplate;

    @Autowired
    private ProductClient productClient;

    @RequestMapping("/getProductMsg")
    public String getProductMsg() {
        //1. 第一种方式调用商品服务(直接使用RestTemplate，url写死)
//        RestTemplate template = new RestTemplate();
//        String response = template.getForObject("http://localhost:8080/msg", String.class);

        //2. 第二种方式调用商品服务（利用LoadBalancerClient通过应用名获取url，然后再使用restTemplate）
//        RestTemplate template = new RestTemplate();
        ServiceInstance serviceInstance = loadBalancerClient.choose("PRODUCT");
//        //获取ip
//        String host = serviceInstance.getHost();
//        //获取端口
//        int port = serviceInstance.getPort();
//        String url = String.format("http://%s:%s", host, port)+"/msg";
//        String response = template.getForObject(url, String.class);

        //3. 第三种方式调用商品服务（利用@LoadBalanced，可以在restTemplate里使用应用名字）
//        String response = restTemplate.getForObject("http://PRODUCT/msg", String.class);

        //Feign调用
        String response = productClient.msg();
        log.info("response={}", response);
        return response;
    }

    /**
     * 获取商品列表
     * @return
     */
    @GetMapping("/getProductList")
    public List<ProductInfoOutput> getProductList() {
        List<ProductInfoOutput> productInfoList = productClient.listForOrder(Arrays.asList("157875196366160022", "157875227953464068"));
        log.info("response={}", productInfoList);
        return productInfoList;
    }

    @GetMapping("/productDecreaseStock")
    public String productDecreaseStock() {
        productClient.decreaseStock(Arrays.asList(new DecreaseStockInput("164103465734242707",3)));
        return "ok";
    }


}
